Repository navigation
Distinguish between non-distributed and distributed type parameters - #64237
Conversation
|
TypeScript Bot (@typescript-bot) perf test this faster |
|
Anders Hejlsberg (@ahejlsberg) Here they are:
tscComparison Report - baseline..pr
System info unknown
Hosts
Scenarios
Developer Information: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
TypeScript Bot (@typescript-bot) user test this |
|
Anders Hejlsberg (@ahejlsberg) Here are the results of running the user tests with tsc comparing There were infrastructure failures potentially unrelated to your change:
Otherwise... Something interesting changed - please have a look. Details
|
|
Anders Hejlsberg (@ahejlsberg) Here are the results of running the top 1000 repos with tsc comparing Something interesting changed - please have a look. Details
|
|
TypeScript Bot (@typescript-bot) test top1000 |
|
TypeScript Bot (@typescript-bot) user test this |
|
Mateusz Burzyński (@Andarist) I went through and examined all the places we use |
|
Mateusz Burzyński (@Andarist) Borrowed your regression test, thanks for researching. |
|
TypeScript Bot (@typescript-bot) user test this |
|
Anders Hejlsberg (@ahejlsberg) Here are the results of running the user tests with tsc comparing There were infrastructure failures potentially unrelated to your change:
Otherwise... Everything looks good! |
|
Tests are clean. Two top 1000 projects have new errors, but those errors are expected. |
| if t.flags&TypeFlagsTypeParameter != 0 && !t.AsTypeParameter().isDistributed { | ||
| for n := node.Parent; n != nil && !ast.IsStatement(n); n = n.Parent { | ||
| if ast.IsConditionalTypeNode(n) { | ||
| if checkTypeNode := n.AsConditionalTypeNode().CheckType; isSimpleIdentifierTypeReference(checkTypeNode) && c.getSymbolFromTypeReference(checkTypeNode) == t.symbol { |
There was a problem hiding this comment.
Why not c.getTypeFromTypeNode(n).AsConditionalType().root.isDistributive, so the distribution-choice logic stays centralized?
There was a problem hiding this comment.
We can't call getTypeFromTypeNode here without triggering infinite recursion in some scenarios. Thus the more restrained check that only does simple symbol resolution.
Wesley Wigham (weswigham)
left a comment
There was a problem hiding this comment.
Is it weird that I'm happy to get getMappedType back over the instance method? It's weird.
Love the new quick info - we should consider showing substitution types at a location in a similar manner.
…S_unwrap` on TS 7.1 Since microsoft/TypeScript#64237 the false-branch `T` of a distributive conditional is the distributed type parameter, so inference no longer sees `T` at the top level of `__VLS_unwrap`'s return type and widens `const n = 1` to `number`. This broke dynamic slot names such as `#[\`action${n}\`]` (#4668). A `const` type parameter disables the widening without changing the conditional's distribution.
With this PR we distinguish between non-distributed and distributed type parameters in conditional types. Previously we didn't which could lead to constraint violations. In the example
we previously didn't report a constraint violation on
Show<A, B>. We now report a new errorA type parameter is considered to be distributed when it is referenced within a conditional type that distributes that type parameter. Specfically, in a conditional type
T extends XXX ? AAA : BBB,Tis considered distributed within the typesXXX,AAA, andBBB.The distributed form of a type parameter is a subtype of the non-distributed form of that type parameter, and behaves accordingly. In the
Issue<A, B extends A>type above,Bis known to extend the non-distributedA, but that doesn't imply it extends the distributedA, which is a subtype of the non-distributedA. For example, the typeIssue<0 | 1, 0>creates a union ofShow<0, 0>andShow<1, 0>, the second of which violates the constraints declared inShow<T, U extends T>.The language service now shows
(distributed)when hovering over distributed type parameters:This makes it easier to recognize when a type parameter is distributed.
Fixes #63708.